package com.kgcx.price.utils;

import com.alibaba.fastjson.JSONObject;
import com.kgcx.common.utils.UUIDUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * 发布消息的回调类
 *
 * 必须实现MqttCallback的接口并实现对应的相关接口方法
 *      ◦CallBack 类将实现 MqttCallBack。每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。在回调中，将它用来标识已经启动了该回调的哪个实例。
 *  ◦必须在回调类中实现三个方法：
 *
 *  public void messageArrived(MqttTopic topic, MqttMessage message)
 *  接收已经预订的发布。
 *
 *  public void connectionLost(Throwable cause)
 *  在断开连接时调用。
 *
 *  public void deliveryComplete(MqttDeliveryToken token))
 *      接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
 *  ◦由 MqttClient.connect 激活此回调。
 *
 */
@Component
public class DriverPushCallback implements MqttCallback {

    @Autowired
    MqttClientUtil mqttClientUtil;

    @Override
    public void connectionLost(Throwable cause) {
        // 连接丢失后，一般在这里面进行重连
        System.out.println("司机连接断开，可以做重连");

    }

    private StringRedisTemplate stringRedisTemplate;

    public DriverPushCallback(StringRedisTemplate stringRedisTemplate)
    {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        // subscribe后得到的消息会执行到这里面
        System.out.println("接收消息主题:"+ s);
        System.out.println("接收消息Qos:"+mqttMessage.getQos());
        System.out.println("接收消息内容:"+new String(mqttMessage.getPayload()));
        System.out.println(mqttMessage.isDuplicate());

        String payload = new String(mqttMessage.getPayload());

        if(!"close".equals(payload))
        {
            JSONObject jsonObject = JSONObject.parseObject(payload);

            /** 数据入redis，用python脚本将坐标信息入库 */
            if(!(StringUtils.isEmpty(jsonObject.getString("orderId")) && StringUtils.isEmpty(jsonObject.getString("driverId"))
                    && StringUtils.isEmpty(jsonObject.getString("lng")) && StringUtils.isEmpty(jsonObject.getString("lat"))))
            {
                jsonObject.put("kid", UUIDUtils.getOrderSnByTime18());
                stringRedisTemplate.opsForList().rightPush("mileageRecord_" + jsonObject.getString("driverId"), jsonObject.toJSONString());
            }

            /** 发送mq消息到监管上送平台，通知监管上送平台将数据提交到监管平台 */
        }
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        // publish后会执行到这里
        System.out.println("deliveryComplete---------"+ iMqttDeliveryToken.isComplete());
    }


}
